package cn.vehicle.service.impl;

import cn.vehicle.domains.bo.QueryTransportVehicleBo;
import cn.vehicle.domains.entity.TransportVehicleEntity;
import cn.vehicle.exception.VehicleAccessException;
import cn.vehicle.mapper.TransportVehicleMapper;
import cn.vehicle.service.TransportVehicleService;
import jakarta.annotation.Resource;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 运输车辆服务实现类
 * <p>
 * 负责运输车辆的持久化操作，包括新增、修改、删除、查询等。
 * 通过 {@link TransportVehicleMapper} 与数据库交互，为业务层（Biz 层）提供数据访问服务。
 * </p>
 *
 * <p>主要职责：</p>
 * <ul>
 *   <li>封装运输车辆表的基础增删改查逻辑；</li>
 *   <li>捕获数据库异常并转换为业务异常 {@link VehicleAccessException}；</li>
 *   <li>保证数据操作的一致性和安全性。</li>
 * </ul>
 */
@Service
public class TransportVehicleServiceImpl implements TransportVehicleService {

    @Resource
    private TransportVehicleMapper transportVehicleMapper;

    /**
     * 新增运输车辆
     *
     * @param transportVehicleEntity 运输车辆实体对象
     * @throws VehicleAccessException 当车辆已存在（唯一键冲突）时抛出
     */
    @Override
    public void addTransportVehicle(TransportVehicleEntity transportVehicleEntity) {
        try {
            // 调用 Mapper 层执行插入操作，将运输车辆信息写入数据库
            transportVehicleMapper.insertTransportVehicle(transportVehicleEntity);
        } catch (DuplicateKeyException e) {
            // 捕获唯一键冲突异常并转换为业务异常，提示“车辆已存在”
            throw VehicleAccessException.DATE_EXIST.newInstance("车辆已存在");
        }
    }

    /**
     * 根据ID查询运输车辆信息
     *
     * @param id 运输车辆主键ID
     * @return 运输车辆实体对象
     */
    @Override
    public TransportVehicleEntity getTransportVehicleById(Long id) {
        // 根据主键ID查询数据库中的运输车辆信息
        return transportVehicleMapper.selectTransportVehicleById(id);
    }

    /**
     * 更新运输车辆信息
     *
     * @param updateEntity 更新的运输车辆实体对象
     * @throws VehicleAccessException 若更新失败（未匹配到记录）则抛出异常
     */
    @Override
    public void updateTransportVehicle(TransportVehicleEntity updateEntity) {
        // 执行选择性更新操作，仅更新非空字段
        int i = transportVehicleMapper.updateTransportVehicleSelective(updateEntity);
        // 若未更新到任何记录，说明对应数据不存在，抛出业务异常
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("更新车辆未更新到数据");
        }
    }

    /**
     * 删除运输车辆
     *
     * @param id 运输车辆主键ID
     * @throws VehicleAccessException 若删除失败（记录不存在）则抛出异常
     */
    @Override
    public void deleteTransportVehicle(Long id) {
        // 根据主键ID执行删除操作
        int i = transportVehicleMapper.deleteTransportVehicleById(id);
        // 若未删除到记录，说明目标车辆不存在或已被删除
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("删除车辆未删除到数据");
        }
    }

    /**
     * 查询运输车辆列表
     *
     * @param queryTransportVehicleBo 查询条件封装对象
     * @return 运输车辆实体列表
     */
    @Override
    public List<TransportVehicleEntity> selectTransportVehicleList(QueryTransportVehicleBo queryTransportVehicleBo) {
        // 根据查询条件执行数据库查询，返回符合条件的运输车辆列表
        return transportVehicleMapper.selectTransportVehicleList(queryTransportVehicleBo);
    }


}
